import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import java.util.Scanner;


public class LauncherNew {
	static Estado einicial;
	static Estado efinal;
	static int profundidadmax;

	public static void main(String[] args) throws FileNotFoundException {
		Scanner sc = new Scanner(System.in);
		sc.useLocale(Locale.US);
		String estrategia;
		String sFichero = "Mapa_Global.h5";
		File fichero = new File(sFichero);
		ArrayList<Hoja> hojas= new ArrayList<Hoja>();

		// Si el fichero no existe...
		if (!fichero.exists()){ 
			// Leeemos los ficheros .asc
			Hoja hoja1= UTIL.Init("MDT25-0711-H30.asc");
			Hoja hoja2= UTIL.Init("MDT25-0712-H30.asc");
			Hoja hoja3= UTIL.Init("MDT25-0736-H30.asc");
			Hoja hoja4= UTIL.Init("MDT25-0737-H30.asc");

			hojas.add(hoja1);
			hojas.add(hoja2);
			hojas.add(hoja3);
			hojas.add(hoja4);


			// Creamos la jerarquia.
			UTIL.CreateHDF5();

			// Escribimos cada hoja en un dataset dentro del fichero .h5
			for(int i=0;i<hojas.size();i++)
				UTIL.ReadWriteDataset(hojas.get(i));
		}

		//ContenedorNodos.ordenarNodos(new Nodo(0, null, einicial, 0, 0, 0, 0));

		//Menu de seleccion de ruta
		
		System.out.println("Inserte la coordenada X UMT del lugar inicial:");
		int coordenadaUMTinicialX=sc.nextInt();			//397388;
		System.out.println("Inserte la coordenada Y UMT del lugar inicial:");
		int coordenadaUMTinicialY=sc.nextInt();			//4353788;
		
		System.out.println("Inserte la coordenada X UMT del lugar destino:");
		int coordenadaUMTfinalX=sc.nextInt();		//399690;
		System.out.println("Inserte la coordenada Y UMT del lugar destino:");
		int coordenadaUMTfinalY=sc.nextInt();		//4360861;
		
		einicial= Problema.estadoInicial(coordenadaUMTinicialX  , coordenadaUMTinicialY  );
		efinal= Problema.estadoInicial(coordenadaUMTfinalX , coordenadaUMTfinalY);
		profundidadmax= 10000000;
		boolean error=false;

		//Menu de seleccion de búsqueda

		do{
			System.out.println("Inserte el número correspondiente a la estrategia de búsqueda que quiera usar:");
			System.out.println("1. Búsqueda en profundidad.");
			System.out.println("2. Búsqueda en anchura.");
			System.out.println("3. Búsqueda de costo uniforme.");
			System.out.println("4. Búsqueda voraz.");
			System.out.println("5. Búsqueda A*.");
			estrategia = sc.next();

			switch(estrategia){

			case "1" :
				estrategia = "profundidad";

				break;

			case "2":
				estrategia = "anchura";

				break;

			case "3":
				estrategia = "uniforme";

				break;

			case "4":
				estrategia = "voraz";

				break;

			case "5":
				estrategia = "A";

				break;

			default:
				System.out.println("La estrategia seleccionada no existe. Elija una correcta.");
				error = true;
						break;

			}
		}while(error=true);


		if(einicial!=null && efinal!=null){
			Nodo nodo_actual = EstrategiasDeBusqueda.busqueda(estrategia);
			if (nodo_actual == null){
				System.out.println("Solucion no encontrada");
			}
			System.out.println("Profundidad: "+nodo_actual.getProfundidad());
			System.out.println("ID: "+nodo_actual.getID());
			System.out.println("Valoracion: "+nodo_actual.getValoracion());
			System.out.println("Heuristica nodo actual: "+nodo_actual.getHeuristica());
			System.out.println("Costo nodo actual: "+nodo_actual.getCosto());
			generarInforme(nodo_actual);
		}else
			System.out.println("Coordenadas origen o destino fuera de limites de busqueda");

		Calendar calendario = Calendar.getInstance();
		int hora, minutos, segundos;

		hora =calendario.get(Calendar.HOUR_OF_DAY);
		minutos = calendario.get(Calendar.MINUTE);
		segundos = calendario.get(Calendar.SECOND);


		System.out.println(hora + ":" + minutos + ":" + segundos);
		

		UTIL.CerrarHDF5();
	}
	
	//Informe por fichero
	public static void generarInforme(Nodo nodo_actual) throws IOException{
		FileWriter fichero = new FileWriter("informe.txt");
		PrintWriter pw = new PrintWriter(fichero);
		Calendar calendario = Calendar.getInstance();
		int hora, minutos, segundos;

		hora =calendario.get(Calendar.HOUR_OF_DAY);
		minutos = calendario.get(Calendar.MINUTE);
		segundos = calendario.get(Calendar.SECOND);
		
		pw.println("Costo total del camino: " + nodo_actual.getCosto() + "profundidad: " + nodo_actual.getProfundidad() + "Tiempo de ejecución: " + hora + "h:" + minutos + "m:" + segundos + "s");
		for(int i=0; i<10 ;i++){ //Modificar con numero de nodos del camino solucion
			pw.println();	//Lugar Geografico y altitud de cada nodo
		}
		
	
		fichero.close();
	}
}